﻿// Copyright (c) 2012 - 2020 Jared Zheng <jaredz at outlook dot com>
// Buddha Framework is licensed under Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
//          http://license.coscl.org.cn/MulanPSL2
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
//
// Create : 2012-12-01 version 0.1 Jared Zheng <jaredz at outlook dot com>
// Update : 2018-12-05 version 3.1.5 Jared Zheng <jaredz at outlook dot com>

#ifndef __SESSION_BASE_H__
#define __SESSION_BASE_H__

#pragma once

#include "mobject.h"
///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 会话状态
enum SESSION_STATUS
{
    //--------------------------------------------
    // !!!以下开始保留状态
    SESSION_STATUS_DEFAULT,   ///< 默认处理, 自定义状态返回等同与SESSION_STATUS_HANDLE
    SESSION_STATUS_HANDLE,    ///< 已经处理, 框架不会更新会话状态, 对连接不做如何处理

    SESSION_STATUS_BOND,      ///< 连接状态, SESSION_STATUS_LOGIN和SESSION_STATUS_LOGINWAIT处理默认行为都会恢复到SESSION_STATUS_BOND

    SESSION_STATUS_LOGIN,     ///< 登陆异步回复状态
    SESSION_STATUS_LOGINWAIT, ///< 登陆需要内部处理等待
    SESSION_STATUS_LOGINACK,  ///< 登陆状态回复

    SESSION_STATUS_UPDATE,    ///< 更新业务管理服务器签证
    SESSION_STATUS_UPDATEWAIT,///< 更新业务管理服务器签证时与同步管理断开的排队等待状态
    SESSION_STATUS_UPDATEACK, ///< 更新业务管理服务器签证回复
    // 现在未支持手动选择
    SESSION_STATUS_LIST,      ///< 获取业务管理服务器列表
    SESSION_STATUS_LISTACK,   ///< 回复业务管理服务器列表
    SESSION_STATUS_SELECT,    ///< 手动选择业务管理服务器
    SESSION_STATUS_SELECTACK, ///< 回复手动选择业务管理服务器
    // 业务区签证流程
    SESSION_STATUS_VISA,      ///< 业务管理服务器签证
    SESSION_STATUS_VISAWAIT,  ///< 业务管理服务器签证时与同步管理断开的排队等待状态
    SESSION_STATUS_VISAACK,   ///< 业务管理服务器签证回复
    // 业务区签证验证
    SESSION_STATUS_CHECK,     ///< 业务区登陆验证
    SESSION_STATUS_COMPLETE,  ///< 业务区登陆完成
};

///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 会话超时检测标志, 对应不同的超时检测时间
enum SESSION_TIME_ID
{
    SESSION_ID_NONE,
    SESSION_ID_MIN,
    SESSION_ID_MAX,
    SESSION_ID_IDLE,

    SESSION_ID_WAIT,
    SESSION_ID_LOGINWAIT,
    SESSION_ID_UPDATEWAIT,
    SESSION_ID_VISAWAIT,

    SESSION_ID_AUTHOR = 3001,
    SESSION_ID_GATE   = 7001,
};

///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 会话超时检测默认值, 会从扩展配置文件读取具体参数
enum SESSION_TIME_DEFAULT
{
    SESSION_TIME_COMPLETE     = 3,                ///< 签证流程完成等待次数
    SESSION_TIME_MASTER_TRY   = 5,                ///< 签证流程次数上限
#ifdef __RUNTIME_DEBUG__
    SESSION_TIME_OUT_TICK     = 16  * 1000,       ///< 超时检测定时器时间, 超时时间

    SESSION_TIME_OUT_MIN      = 64  * 1000,       ///< 签证业务服务器超时时间
    SESSION_TIME_OUT_MID      = 80  * 1000,       ///< 签证授权服务器超时时间
    SESSION_TIME_OUT_MAX      = 128 * 1000,       ///< 提交授权数据处理等待最长回复时间或者CompleteAck
    SESSION_TIME_OUT_IDLE     = 128 * 60 * 1000,  ///< 连接上以后或者手动选择业务管理等待时间上限
    SESSION_TIME_OUT_WAIT     = 128 * 60 * 1000,  ///< 授权数据或者业务管理不在线最长等待时间
#else
    SESSION_TIME_OUT_TICK     = 8 * 1000,         ///< 超时检测定时器时间, 超时时间

    SESSION_TIME_OUT_MIN      = 16 * 1000,        ///< 签证业务服务器超时时间
    SESSION_TIME_OUT_MID      = 24 * 1000,        ///< 签证授权服务器超时时间
    SESSION_TIME_OUT_MAX      = 64 * 1000,        ///< 提交授权数据处理等待最长回复时间或者CompleteAck
    SESSION_TIME_OUT_IDLE     = 16 * 60 * 1000,   ///< 连接上以后或者手动选择业务管理等待时间上限
    SESSION_TIME_OUT_WAIT     = 64 * 60 * 1000,   ///< 授权数据或者业务管理不在线最长等待时间
#endif
};

///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 连接步骤
enum SESSION_BOND_STEP
{
    SESSION_BOND_NONE,
    SESSION_BOND_WAIT,   // 登陆等待时间, GetSessionId返回授权网关的id
    SESSION_BOND_UPDATE, // 直接跳过授权认证进入更新业务
    SESSION_BOND_LOGIN,  // 可以登陆, 附加数据为授权数据id[UInt]+同步管理id[UInt]+授权数据维护开始时间[UInt-TimeStamp]+授权数据维护结束时间[UInt-TimeStamp]
    SESSION_BOND_RESUME, // 原本云端内部异常导致的不能登陆已经解决, 恢复登陆, 附加数据为授权数据id[UInt]+同步管理id[UInt]
    SESSION_BOND_LOGOUT, // 登出, 附加数据为授权数据id[UInt]+同步管理id[UInt]+授权数据维护开始时间[UInt-TimeStamp]+授权数据维护结束时间[UInt-TimeStamp]
};

enum SESSION_BOND_TARGET
{
    SESSION_TARGET_DEFAULT,
    SESSION_TARGET_HTML5,
};

struct tagSESSION_BOND : public MObject
{
    // 控制头部
    LLong    llUpdate; // 服务器时间戳
    UInt     uVer;     // 会话信息包含版本信息, 用于后期按不同版本数据处理的兼容, 必须填写正确
    UInt     uTarget;  // 目标类型
    // 连接数据
    UInt     uMajor;   // 主版本
    UInt     uMinor;   // 次版本
    UInt     uType;    // 自定义类型
    UInt     uSelect;  // 业务区签证流程自动/手动模式, (现在不支持手动选择)FALSE---自动选择业务管理, TRUE---手动选择业务管理
};
typedef tagSESSION_BOND SESSION_BOND, *PSESSION_BOND;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 登陆数据
enum SESSION_LOGIN_STEP
{
    SESSION_LOGIN_ACK,   // 回复无其他信息
    SESSION_LOGIN_VISA,  // 回复带签证排队数据
};

struct tagSESSION_ID : public MObject
{
    // 控制头部
    LLong    llUpdate; // 服务器时间戳
    UInt     uVer;     // 会话信息包含版本信息, 用于后期按不同版本数据处理的兼容, 必须填写正确
    // 授权基本数据
    UInt     uTarget;  // 自定义目标类型
    UInt     uType;    // 自定义类型
    UInt     uId;      // 自定义id1
    ULLong   ullId;    // 自定义id2
};
typedef tagSESSION_ID SESSION_ID, *PSESSION_ID;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 签证排队模式
enum VISA_MODE
{
    VISA_MODE_NONE,
    VISA_MODE_SELECT,
};

enum VISA_QUEUE
{
    VISA_QUEUE_DEFAULT = 256,
    VISA_QUEUE_LIMIT   = 512,
};

///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 完成签证模式
enum COMPLETE_MODE
{
    COMPLETE_MODE_NONE,
    COMPLETE_MODE_LIVE,
};

///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 内部服务器 : 外网端的请求在内部服务器中转时, 中转请求最开始的数据就是时间戳
///             使用时间戳来验证回复是否是当前请求的
//struct tagSERVER_TIMESTAMP : public MObject
//{
//    LLong    llUpdate;
//};
//typedef tagSERVER_TIMESTAMP SERVER_TIMESTAMP, *PSERVER_TIMESTAMP;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 业务
enum MASTER_STEP_TOKEN
{
    MASTER_TOKEN_BOND,  // 业务令牌登陆
    MASTER_TOKEN_CHECK, // [ULLong]Token2
};

struct tagMASTER_BOND : public MObject
{
    LLong      llUpdate;
    ULLong     ullToken;
    UInt       uMasterId;
    UInt       uGateId;
    //CNetAddr   GateAddr;
};
typedef tagMASTER_BOND MASTER_BOND, *PMASTER_BOND;

struct tagMASTER_CHECK : public MObject
{
    LLong    llUpdate;
    ULLong   ullToken;
};
typedef tagMASTER_CHECK MASTER_CHECK, *PMASTER_CHECK;

#endif // __SESSION_BASE_H__
